<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        // -------------------------------------------
        // var a = 123;
        // console.log(a);
        // console.log(window);
        // a = 123
        // window.a = 123
        // console.log(window);
        // ----------------------------------------------
        // function fn() {
        //     var b = 234
        //         // console.log(b);
        //         // console.log(window);
        //     c = 555
        //     console.log(window);
        // }
        // fn()
        // -------------------------------------------------
        // 变量提升是变量的声明会提升至本作用域的最顶部
        // console.log(a)
        // var a = 123
        // var a;
        // console.log(a)
        // a = 123

        // a = 234
        // console.log(a)
        // var a
        // ------------------------------------------------
        // let声明的变量不存在变量提升 因为let声明变量后会将当前代码块转化为一个暂时性的死区
        // let声明的变量首次可以不赋值 let声明的变量在相同作用于内不能重复定义
        // console.log(a)
        // let a;
        {
            // console.log(a);
            // let a;
            // a = 234
            // console.log(a);
            // var b = 123
            // var a = 123
            // var a = 234
            // console.log(a);
            // let a = 124
            // let a = 123
        }
        // console.log(b);
        // if (true) {
        //     var c = 234
        // }
        // console.log(c);
        // for (var i = 0; i < 7; i++) {
        //     var m = i
        // }
        // console.log(m);
        // function fn() {
        //     let a = 124
        // }

        // function fn2() {
        //     let a = 123
        // }
        // -----------------------------
        // const命令声明的常量也是不提升，同样存在暂时性死区，只能在声明的位置后面使用。
        // const声明的常量必须有默认值 const声明的是常量 不能重新赋值 但是如果值是引用数据类型 数据内部的属性是可以修改额
        // const a = 1;
        // console.log(a);
        // a = 2
        const obj = {
            name: '张三'
        }
        obj.name = '李四'
    </script>
</body>

</html>